Die logistische Regression

Agresti - Categorical Data Analysis (2002)

  • Sehr intiutiv geschriebenes Buch
  • Sehr ausführliches begleitendes Skript von Thompson
  • Das Skript eignet sich um die kategoriale Datenanalyse nachzuvollziehen

Faraway Bücher zu Regression in R

Binäre AVs mit glm

  • Die logistische Regression gehört zur Klasse der generalisierten linearen Modelle (GLM)
  • Die Funktion zur Schätzung eines Modells dieser Klasse in heißt glm()
  • glm() muss 1. ein Formel-Objekt mitgegeben werden und 2. die Klasse (binomial, gaussian, Gamma) samt link-Funktion (logit, probit, cauchit, log, cloglog)

Beispieldaten für die logistische Regression

install.packages("HSAUR")
library("HSAUR")
data("plasma", package = "HSAUR")

Logistische Regression mit R

cdplot(ESR ~ fibrinogen, data = plasma)

Logistische Regression mit R

plasma_glm_1 <- glm(ESR ~ fibrinogen, data = plasma, 
                    family = binomial())

Weitere Beispieldaten

install.packages("faraway")
library("faraway")
data(orings)
temp damage
53 5
57 1
58 1

Generalisierte Regression mit R - weitere Funktionen

  • Logistisches Modell mit Probit-Link:
probitmod <- glm(cbind(damage,6-damage) ~ temp, 
    family=binomial(link=probit), orings)
  • Regression mit Zähldaten:
modp <- glm(Species ~ .,family=poisson,gala)
  • Proportional odds logistic regression im Paket MASS:
library("MASS")
house.plr<-polr(Sat~Infl,weights=Freq,data=housing)

Linkliste - logistische Regression

Aufgabe - Datenanalyse

  • Laden Sie einen Datensatz Ihrer Wahl - entweder einen eigenen oder einen der vorgestellten Datensätze
  • Berechnen Sie einfache Statistiken auf den wichtigsten Variablen (Mittelwert, Median, Standardabweichung)
  • Erzeugen Sie eine zweidimensionale Häufigkeitstabelle
  • Führen Sie eine Regression mit sinnvoll gewählten abhängiger und unabhängiger Variablen auf den Daten durch
  • Erzeugen Sie einen Lattice-plot

Zurück zur Gliederung.

Faktoren in R

Was sind Faktoren in R

  • Faktoren können eine begrenzte Zahl von Ausprägungen annehmen
  • Sie werden oft auch als kategoriale Variablen bezeichnet
  • Sie sind vor allem bei der Modellierung wichtig
  • Faktoren werden anders behandelt als stetige Variablen
  • Wenn man diese Variablen richtig definiert werden sie auch von R richtig behandelt

http://www.stat.berkeley.edu/~s133/factors.html

Beispiel Definition von Faktoren

data <- c(1,2,2,3,1,2,3,3,1,2,3,3,1)
fdata <- factor(data)
fdata
##  [1] 1 2 2 3 1 2 3 3 1 2 3 3 1
## Levels: 1 2 3
  • labels direkt definieren
rdata <- factor(data,labels=c("I","II","III"))
rdata
##  [1] I   II  II  III I   II  III III I   II  III III I  
## Levels: I II III

Weitere Möglichkeit der Definition

levels(fdata) <- c('I','II','III')
fdata
##  [1] I   II  II  III I   II  III III I   II  III III I  
## Levels: I II III

Beispiel Monate

mons <- c("March","April","January",
          "November","January","September",
          "October","September","November",
          "August","January","November",
          "November","February","May",
          "August","July","December",
          "August","August","September",
          "November","February","April")
mons <- factor(mons)
table(mons)
## mons
##     April    August  December  February   January      July     March 
##         2         4         1         2         3         1         1 
##       May  November   October September 
##         1         5         1         3

Beispiel: ordered factor

mons <- factor(mons,levels=c("January","February",
                             "March","April","May","June",
                             "July","August","September",  
                             "October","November",
                             "December"),
               ordered=TRUE)

mons[1] < mons[2]
## [1] TRUE

Rücktransformation

fert <- c(10,20,20,50,10,20,10,50,20)
fert <- factor(fert,levels=c(10,20,50),ordered=TRUE)
fert
## [1] 10 20 20 50 10 20 10 50 20
## Levels: 10 < 20 < 50
mean(fert)
## [1] NA
mean(as.numeric(levels(fert)[fert]))
## [1] 23.33333

Tabellen mit Faktoren

lets <- sample(letters,size=100,replace=TRUE)
lets <- factor(lets)
table(lets[1:5])
## 
## a b c d e f g h i j k l m n o p q r s t u v w x y z 
## 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0

Grafiken mit ggplot

Das Paket ggplot2

  • Entwickelt von Hadley Wickham
  • Viele Informationen unter:
  • http://ggplot2.org/
  • Den Graphiken liegt eine eigene Grammitik zu Grunde

Basiseinführung ggplot2

<www.r-bloggers.com/basic-introduction-to-ggplot2/>

install.packages("ggplot2")
library(ggplot2)

Der diamonds Datensatz

head(diamonds)
carat cut color clarity depth table price x y z
0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
0.29 Premium I VS2 62.4 58 334 4.20 4.23 2.63
0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48

Wie nutzt man qplot

  • Die Funktion qplot wird für schnelle Graphiken verwendet (quick plots)
  • bei der Funktion ggplot kann man alles bis ins Detail kontrollieren
# histogram
qplot(depth, data=diamonds)

Ein Balkendiagramm

qplot(cut, depth, data=diamonds)

Ein weiteres Balkendiagramm

qplot(factor(cyl), data=mtcars,geom="bar")

Boxplot

qplot(data=diamonds,x=cut,y=depth,geom="boxplot")

Scatterplot

# scatterplot
qplot(carat, depth, data=diamonds)

Farbe hinzu:

qplot(carat, depth, data=diamonds,color=cut)

Trendlinie hinzufügen

myGG<-qplot(data=diamonds,x=carat,y=depth,color=carat) 
myGG + stat_smooth(method="lm")

Graphik drehen

qplot(factor(cyl), data=mtcars, geom="bar") + 
coord_flip()

Wie nutzt man ggplot

  • die aestetics:
ggplot(diamonds, aes(clarity, fill=cut)) + geom_bar()

Farben selber wählen

Es wird das Paket RColorBrewer verwendet um die Farbpalette zu ändern

install.packages("RColorBrewer")
library(RColorBrewer)
myColors <- brewer.pal(5,"Accent")
names(myColors) <- levels(diamonds$cut)
colScale <- scale_colour_manual(name = "cut",
                                values = myColors)

http://stackoverflow.com/questions/6919025/

Eine Graphik mit den gewählten Farben

p <- ggplot(diamonds,aes(carat, depth,colour = cut)) + 
  geom_point()
p + colScale

Speichern mit ggsave

ggsave("Graphik.jpg")

Einfache Karten mit R erstellen

Gliederung

Arten von räumlichen Daten:

Das R-paket ggmap wird im folgenden genutzt um verschiedene Kartentypen darzustellen.

Mit qmap kann man eine schnelle Karte erzeugen.

Straßenkarten

  • Straßenkarte werden sehr häufig verwendet.
  • Diese Karten zeigen Haupt- und Nebenstraßen (abhängig vom Detail)
  • oft sind auch weitere Informationen enthalten. Wie beispielsweise Flughäfen, Städte, Campingplätze oder andere Orte von Interesse
  • Beispiel einer Straßenkarte für Mannheim.

Installieren des Paketes

  • Zur Erstellung der Karten brauchen wir das Paket ggmap:
devtools::install_github("dkahle/ggmap")
devtools::install_github("hadley/ggplot2")
install.packages("ggmap")

Paket ggmap - Hallo Welt

  • Um das Paket zu laden verwenden wir den Befehl library
library(ggmap)

Und schon kann die erste Karte erstellt werden:

qmap("Mannheim")

Karte für eine Sehenswürdigkeit

BBT <- qmap("Berlin Brandenburger Tor")
BBT

Karte für einen ganzen Staat

qmap("Germany")

  • Wir brauchen ein anderes zoom level

Ein anderes zoom level

  • level 3 - Kontinent
  • level 10 - Stadt
  • level 21 - Gebäude
qmap("Germany", zoom = 6)

Hilfe bekommen wir mit dem Fragezeichen

?qmap

Verschiedene Abschnitte in der Hilfe:

  • Description
  • Usage
  • Arguments
  • Value
  • Author(s)
  • See Also
  • Examples

Die Beispiele in der Hilfe

Ausschnitt aus der Hilfe Seite zum Befehl qmap:

qmap Example

qmap Example

Das Beispiel kann man direkt in die Konsole kopieren:

# qmap("baylor university")
qmap("baylor university", zoom = 14)
# und so weiter

Ein anderes zoom level

qmap("Mannheim", zoom = 12)

Näher rankommen

qmap('Mannheim', zoom = 13)

Ganz nah dran

qmap('Mannheim', zoom = 20)

ggmap - maptype satellite

qmap('Mannheim', zoom = 14, maptype="satellite")

ggmap - maptype satellite zoom 20

qmap('Mannheim', zoom = 20, maptype="hybrid")

ggmap - maptype hybrid

qmap("Mannheim", zoom = 14, maptype="hybrid")

Terrain/physical maps

  • Aus Physischen Karten kann man Informationen über Berge, Flüsse und Seen ablesen.

  • Farben werden oft genutzt um Höhenunterschiede zu visualisieren

ggmap - terrain map

qmap('Schriesheim', zoom = 14,maptype="terrain")

Abstrahierte Karten (http://www.designfaves.com)

New York

New York

  • Abstraktion wird genutzt um nur die essentiellen Informationen einer Karte zu zeigen.

  • Bsp. U-Bahn Karten - wichtig sind Richtungen und wenig Infos zur Orientierung

  • Im folgenden werden Karten vorgestellt, die sich gut als Hintergrundkarten eignen.

ggmap - maptype watercolor

qmap('Mannheim', zoom = 14,maptype="watercolor",source="stamen")

ggmap - source stamen

qmap('Mannheim', zoom = 14,
 maptype="toner",source="stamen")

ggmap - maptype toner-lite

qmap('Mannheim', zoom = 14,
 maptype="toner-lite",source="stamen")

ggmap - maptype toner-hybrid

qmap('Mannheim', zoom = 14,
 maptype="toner-hybrid",source="stamen")

ggmap - maptype terrain-lines

qmap('Mannheim', zoom = 14,
 maptype="terrain-lines",source="stamen")

Graphiken speichern

RstudioExport

RstudioExport

ggmap - ein Objekt erzeugen

  • <- ist der Zuweisungspfeil um ein Objekt zu erzeugen
  • Dieses Vorgehen macht bspw. Sinn, wenn mehrere Karten nebeneinander gebraucht werden.
MA_map <- qmap('Mannheim', 
               zoom = 14,
               maptype="toner",
               source="stamen")

Geokodierung

Geocoding (…) uses a description of a location, most typically a postal address or place name, to find geographic coordinates from spatial reference data …

Wikipedia - Geocoding

library(ggmap)
geocode("Mannheim",source="google")
lon lat
8.463243 49.48604

Latitude und Longitude

LatLon

LatLon

http://modernsurvivalblog.com

Koordinaten verschiedener Orte in Deutschland

cities lon lat
Hamburg 9.993682 53.55108
Koeln 6.960279 50.93753
Dresden 13.737262 51.05041
Muenchen 11.581981 48.13513

Reverse Geokodierung

Reverse geocoding is the process of back (reverse) coding of a point location (latitude, longitude) to a readable address or place name. This permits the identification of nearby street addresses, places, and/or areal subdivisions such as neighbourhoods, county, state, or country.

Quelle: Wikipedia

revgeocode(c(48,8))
## [1] "Unnamed Road, Somalia"

Die Distanz zwischen zwei Punkten

mapdist("Q1, 4 Mannheim","B2, 1 Mannheim")
##             from             to   m    km     miles seconds  minutes
## 1 Q1, 4 Mannheim B2, 1 Mannheim 749 0.749 0.4654286     212 3.533333
##        hours
## 1 0.05888889
mapdist("Q1, 4 Mannheim","B2, 1 Mannheim",mode="walking")
##             from             to   m    km     miles seconds minutes  hours
## 1 Q1, 4 Mannheim B2, 1 Mannheim 546 0.546 0.3392844     423    7.05 0.1175

Eine andere Distanz bekommen

mapdist("Q1, 4 Mannheim","B2, 1 Mannheim",mode="bicycling")
##             from             to   m    km    miles seconds  minutes
## 1 Q1, 4 Mannheim B2, 1 Mannheim 555 0.555 0.344877     215 3.583333
##        hours
## 1 0.05972222

Geokodierung - verschiedene Punkte von Interesse

POI1 <- geocode("B2, 1 Mannheim",source="google")
POI2 <- geocode("Hbf Mannheim",source="google")
POI3 <- geocode("Mannheim, Friedrichsplatz",source="google")
ListPOI <-rbind(POI1,POI2,POI3)
POI1;POI2;POI3
##        lon      lat
## 1 8.462844 49.48569
##        lon      lat
## 1 8.469879 49.47972
##        lon      lat
## 1 8.475208 49.48326

Punkte in der Karte

MA_map +
geom_point(aes(x = lon, y = lat),
data = ListPOI)

Punkte in der Karte

MA_map +
geom_point(aes(x = lon, y = lat),col="red",
data = ListPOI)

ggmap - verschiedene Farben

ListPOI$color <- c("A","B","C")
MA_map +
geom_point(aes(x = lon, y = lat,col=color),
data = ListPOI)

ggmap - größere Punkte

ListPOI$size <- c(10,20,30)
MA_map +
geom_point(aes(x = lon, y = lat,col=color,size=size),
data = ListPOI)

Eine Route von Google maps bekommen

from <- "Mannheim Hbf"
to <- "Mannheim B2 , 1"
route_df <- route(from, to, structure = "route")

Mehr Information

http://rpackages.ianhowson.com/cran/ggmap/man/route.html

Eine Karte mit dieser Information zeichnen

qmap("Mannheim Hbf", zoom = 14) +
  geom_path(
    aes(x = lon, y = lat),  colour = "red", size = 1.5,
    data = route_df, lineend = "round"
  )

Wie fügt man Punkte hinzu

http://i.stack.imgur.com

pic

pic

Cheatsheet

https://www.rstudio.com/

Cheatsheet

Cheatsheet

Take Home Message

Was klar sein sollte:

  • Wie man eine schnelle Karte erzeugt
  • Wie man geokodiert
  • Wie man eine Distanz berechnet

Regressionsdiagnostik mit R-Paket visreg

Regressionsdiagnostik mit Basis-R

Ein einfaches Modell

N <- 5
x1 <- rnorm(N)
y <- runif(N)

Modellvorhersage machen

mod1 <- lm(y~x1)
pre <- predict(mod1)

Regressionsdiagnostik mit Basis-R

plot(x1,y)
abline(mod1)
segments(x1, y, x1, pre, col="red")

Das visreg-Paket

Ein Modell wird auf dem airquality Datensatz geschätzt

install.packages("visreg")
library(visreg)
fit <- lm(Ozone ~ Solar.R + Wind + Temp, data = airquality)

Visualisierung

visreg(fit)

Und dann mit visreg visualisiert.

  • Zweites Argument - Spezifikation erklärende Variable für Visualisierung
visreg(fit, "Wind", type = "contrast")

Visualisierung mit dem Paket visreg

visreg(fit, "Wind", type = "contrast")

Das visreg-Paket

  • Das Default-Argument für type ist conditional.
visreg(fit, "Wind", type = "conditional")

Regression mit Faktoren

Mit visreg können die Effekte bei Faktoren visualisiert werden.

airquality$Heat <- cut(airquality$Temp, 3, 
    labels=c("Cool", "Mild", "Hot"))
fit.heat <- lm(Ozone ~ Solar.R + Wind + Heat, 
    data = airquality)

Effekte von Faktoren

par(mfrow=c(1,2))
visreg(fit.heat, "Heat", type = "contrast")
visreg(fit.heat, "Heat", type = "conditional")

Das Paket visreg - Interaktionen

airquality$Heat <- cut(airquality$Temp, 3, 
labels=c("Cool", "Mild", "Hot"))
fit <- lm(Ozone ~ Solar.R + Wind * Heat, data = airquality)

Steuern der Graphikausgabe mittels layout

visreg(fit, "Wind", by = "Heat",layout=c(3,1))

Das Paket visreg - Interaktionen overlay

fit <- lm(Ozone ~ Solar.R + Wind * Heat, data = airquality)
visreg(fit, "Wind", by="Heat", overlay=TRUE, partial=FALSE)

Das Paket visreg - visreg2d

fit2 <- lm(Ozone ~ Solar.R + Wind * Temp, data = airquality)
visreg2d(fit2, "Wind", "Temp", plot.type = "image")

Das Paket visreg - surface

visreg2d(fit2, "Wind", "Temp", plot.type = "persp")

Weitere Themen im Ausblick

Mehr User Interface - Der R-commander

library("Rcmdr")

Interaktive Grafiken mit R

Das Paket iplots

install.packages("iplots",dep=TRUE)
  • Das Paket laden:
library(iplots)
cyl.f <- factor(mtcars$cyl)
gear.f <- factor(mtcars$factor)
attach(mtcars)
ihist(mpg) # histogram
ibar(carb) # barchart
iplot(mpg, wt) # scatter plot
ibox(mtcars[c("qsec","disp","hp")]) # boxplots
ipcp(mtcars[c("mpg","wt","hp")]) # parallel coordinates
imosaic(cyl.f,gear.f) # mosaic plot 

R-Paket rggobi

library(rggobi)
g <- ggobi(mydata) 

Interaktion mit plots

attach(mydata)
plot(x, y) # scatterplot
identify(x, y, labels=row.names(mydata)) # identify points
coords <- locator(type="l") # add lines
coords # display list 

Tabellen für Publikationen

library(stargazer)
stargazer(attitude)

Tabellen mit dem R-Paket knitr

library(knitr)
kable(head(iris), format = "latex")
pic

pic

Nichtlineare Regression

Folien zum Workshop:

https://github.com/Japhilko/npRegression/tree/master/slides

library(splines)

Beispiel einer interaktiven Karte

interaktiven Karte und Rcode um eine interaktive Karte mit leaflet zu erzeugen.